home *** CD-ROM | disk | FTP | other *** search
/ Mac Magazin/MacEasy 43 / Mac Magazin and MacEasy Magazine CD - Issue 43.iso / Software / Multimedia / Sound / PlayerPRO 4.6 Dev.Kit / MADH Library 4.6 / MADLibrary Source / OutPut8.c < prev    next >
Encoding:
Text File  |  1998-01-23  |  12.6 KB  |  506 lines  |  [TEXT/CWIE]

  1. /********************                        ***********************/
  2. //
  3. //    Player PRO 4.6 - DRIVER SOURCE CODE -
  4. //
  5. //    Library Version 4.6
  6. //
  7. //    To use with MAD Library for Mac: Symantec, CodeWarrior and MPW
  8. //
  9. //    Antoine ROSSET
  10. //    16 Tranchees
  11. //    1206 GENEVA
  12. //    SWITZERLAND
  13. //
  14. //    COPYRIGHT ANTOINE ROSSET 1996, 1997, 1998
  15. //
  16. //    Thank you for your interest in PlayerPRO !
  17. //
  18. //    FAX:            (+41 22) 346 11 97
  19. //    PHONE:             (+41 79) 203 74 62
  20. //    Internet:         rosset@dial.eunet.ch or RossetAntoine@bluewin.ch
  21. //
  22. /********************                        ***********************/
  23.  
  24. #include "RDriver.h"
  25. #include "RDriverInt.h"
  26.  
  27. void Sampler8in8Add( Channel *curVoice, register Ptr    ASCBuffer, MADDriverRec *intDriver)
  28. {
  29.     Ptr                VolPtr;
  30.     char             *SndBuffer;
  31.     Byte            tByte;
  32.     long             i = intDriver->ASCBUFFER;
  33.     
  34.     ///
  35.     long            off, aDD, aCC = curVoice->lAC;
  36.     
  37.     aDD = (AMIGA_CLOCKFREQ2 << BYTEDIV) / ( curVoice->period * (intDriver->DriverSettings.outPutRate>>16));
  38.     ///
  39.     
  40.     if( curVoice->curPtr >= curVoice->maxPtr && curVoice->loopSize <= 0) return;
  41.     
  42.     SndBuffer        = (char*)     curVoice->curPtr;
  43.     VolPtr            = (Ptr)     (intDriver->Vol + (long) (((DoVol( curVoice) * intDriver->VolExt[ curVoice->ID])/ 64) << 8));
  44.     
  45.     if( (Ptr) SndBuffer + 1 + ((aCC + aDD * intDriver->ASCBUFFER)>>BYTEDIV) >= curVoice->maxPtr)
  46.     {
  47.         if( intDriver->DriverSettings.Interpolation)
  48.         {
  49.             long    RightWeight, LeftWeight;
  50.             
  51.             while( i-- > 0)
  52.             {
  53.                 RightWeight = aCC & ((1 << BYTEDIV) - 1);        LeftWeight = (1 << BYTEDIV) - RightWeight;
  54.                 
  55.                 off = (aCC>>BYTEDIV);
  56.                 if( (Ptr) SndBuffer + off + 1 >= curVoice->maxPtr)
  57.                 {
  58.                     if( curVoice->loopSize > 0) 
  59.                     {
  60.                         SndBuffer -= curVoice->loopSize;
  61.                         if( SndBuffer + off < curVoice->begPtr) SndBuffer = curVoice->begPtr - off;
  62.                     }
  63.                     else break;
  64.                 }
  65.                 
  66.                 tByte = ((         LeftWeight **(SndBuffer + off)
  67.                             +    RightWeight **(SndBuffer + off + 1)) >> BYTEDIV);
  68.  
  69.                 *ASCBuffer    += *(VolPtr + tByte);        aCC += aDD;
  70.                 ASCBuffer    += 2;
  71.             }
  72.         }
  73.         else
  74.         {
  75.             while( i-- > 0)
  76.             {
  77.                 off = (aCC>>BYTEDIV);
  78.                 if( (Ptr) SndBuffer + off >= curVoice->maxPtr)
  79.                 {
  80.                     if( curVoice->loopSize > 0) 
  81.                     {
  82.                         SndBuffer -= curVoice->loopSize;
  83.                         if( SndBuffer + off < curVoice->begPtr) SndBuffer = curVoice->begPtr - off;
  84.                     }
  85.                     else break;
  86.                 }
  87.                 *ASCBuffer    += *(VolPtr + (Byte) *(SndBuffer + off));             aCC += aDD;
  88.                 ASCBuffer    += 2;
  89.             }
  90.         }
  91.         
  92.         if( curVoice->loopSize > 0) curVoice->curPtr = (Ptr) (SndBuffer + (long) (aCC>>BYTEDIV));
  93.         else
  94.         {
  95.             curVoice->samplePtr    = 0L;    curVoice->curPtr    = curVoice->maxPtr;
  96.         }
  97.     }
  98.     else
  99.     {
  100.         if( intDriver->DriverSettings.Interpolation)
  101.         {
  102.             long    RightWeight, LeftWeight;
  103.             
  104.             while( i-- > 0)
  105.             {
  106.                 RightWeight = aCC & ((1 << BYTEDIV) - 1);        LeftWeight = (1 << BYTEDIV) - RightWeight;
  107.                 
  108.                 off = (aCC>>BYTEDIV);
  109.  
  110.                 tByte = ((         LeftWeight **(SndBuffer + off)
  111.                             +    RightWeight **(SndBuffer + off + 1)) >> BYTEDIV);
  112.                 
  113.                 *ASCBuffer    += *(VolPtr + tByte);        aCC += aDD;
  114.                 ASCBuffer    += 2;
  115.             }
  116.         }
  117.         else
  118.         {
  119.             while( i-- > 0)
  120.             {
  121.                 off = (aCC>>BYTEDIV);
  122.                 *ASCBuffer    += *(VolPtr + (Byte) *(SndBuffer + off));             aCC += aDD;
  123.                 ASCBuffer    += 2;
  124.             }
  125.         }
  126.  
  127.         curVoice->curPtr = (Ptr) (SndBuffer + (long) (aCC>>BYTEDIV));
  128.     }
  129.  
  130.     curVoice->lAC = aCC & ((1 << BYTEDIV) - 1);
  131. }
  132.  
  133. void Sampler8in16Add( Channel *curVoice, register Ptr    ASCBuffer, MADDriverRec *intDriver)
  134. {
  135.     char                 *SndBuffer;
  136.     Byte                tByte;
  137.     Ptr                    VolPtr;
  138.     long                i = intDriver->ASCBUFFER;
  139.     
  140.     ///
  141.     long                aDD, aCC = curVoice->lAC, off;
  142.     
  143.     aDD = (AMIGA_CLOCKFREQ2 << BYTEDIV) / ( curVoice->period * (intDriver->DriverSettings.outPutRate>>16));
  144.     ///
  145.  
  146.     if( curVoice->curPtr >= curVoice->maxPtr && curVoice->loopSize == 0) return;
  147.     
  148.     SndBuffer        = (char*) curVoice->curPtr;
  149.     VolPtr            = (Ptr) (intDriver->Vol + (long) (((DoVol( curVoice) * intDriver->VolExt[ curVoice->ID])/ 64) << 8));
  150.     
  151.     if( (Ptr) SndBuffer + 2 + 2L*((aCC + aDD * intDriver->ASCBUFFER)>>BYTEDIV) >= curVoice->maxPtr)
  152.     {
  153.         if( intDriver->DriverSettings.Interpolation)
  154.         {
  155.             long    RightWeight, LeftWeight;
  156.             
  157.             while( i-- > 0)
  158.             {
  159.                 RightWeight = aCC & ((1 << BYTEDIV) - 1);        LeftWeight = (1 << BYTEDIV) - RightWeight;
  160.  
  161.                 off = (aCC>>BYTEDIV);
  162.                 if( (Ptr) SndBuffer + 2*off + 2 >= curVoice->maxPtr)
  163.                 {
  164.                     if( curVoice->loopSize > 0) 
  165.                     {
  166.                         SndBuffer -= curVoice->loopSize;
  167.                         if( SndBuffer + off < curVoice->begPtr) SndBuffer = curVoice->begPtr - off;
  168.                     }
  169.                     else break;
  170.                 }
  171.                 
  172.                 tByte = ((    LeftWeight * (*(SndBuffer + 2*off))
  173.                         +    RightWeight * (*(SndBuffer + 2*off + 2))) >>BYTEDIV);
  174.                 
  175.                 *ASCBuffer += *(VolPtr + tByte);     aCC += aDD;
  176.                 ASCBuffer += 2;
  177.             }
  178.         }
  179.         else
  180.         {
  181.             while( i-- > 0)
  182.             {
  183.                 off = (aCC>>BYTEDIV);
  184.                 if( (Ptr) SndBuffer + 2*off + 2 >= curVoice->maxPtr)
  185.                 {
  186.                     if( curVoice->loopSize > 0) 
  187.                     {
  188.                         SndBuffer -= curVoice->loopSize;
  189.                         if( SndBuffer + off < curVoice->begPtr) SndBuffer = curVoice->begPtr - off;
  190.                     }
  191.                     else break;
  192.                 }
  193.                 
  194.                 *ASCBuffer += *(VolPtr + (Byte) (*(SndBuffer + 2*off)));             aCC += aDD;
  195.                 ASCBuffer += 2;
  196.             }
  197.         }
  198.         
  199.         if( curVoice->loopSize > 0) curVoice->curPtr = (Ptr) (SndBuffer + 2*(long) (aCC>>BYTEDIV));
  200.         else
  201.         {
  202.             curVoice->samplePtr    = 0L;    curVoice->curPtr    = curVoice->maxPtr;
  203.         }
  204.     }
  205.     else
  206.     {
  207.         if( intDriver->DriverSettings.Interpolation)
  208.         {
  209.             long    RightWeight, LeftWeight;
  210.             
  211.             while( i-- > 0)
  212.             {
  213.                 RightWeight = aCC & ((1 << BYTEDIV) - 1);        LeftWeight = (1 << BYTEDIV) - RightWeight;
  214.  
  215.                 off = (aCC>>BYTEDIV);
  216.                 
  217.                 tByte = ((    LeftWeight * (*(SndBuffer + 2*off))
  218.                         +    RightWeight * (*(SndBuffer + 2*off + 2))) >>BYTEDIV);
  219.                 
  220.                 *ASCBuffer += *(VolPtr + tByte);     aCC += aDD;
  221.                 ASCBuffer += 2;
  222.             }
  223.         }
  224.         else
  225.         {
  226.             while( i-- > 0)
  227.             {
  228.                 off = (aCC>>BYTEDIV);
  229.                 *ASCBuffer += *(VolPtr + (Byte) (*(SndBuffer + 2*off)));             aCC += aDD;
  230.                 ASCBuffer += 2;
  231.             }
  232.         }
  233.         
  234.         curVoice->curPtr = (Ptr) (SndBuffer + 2*(long) (aCC>>BYTEDIV));
  235.     }
  236.  
  237.     curVoice->lAC = aCC & ((1 << BYTEDIV) - 1);
  238. }
  239.  
  240. void Sampler8in8AddPoly( Channel *curVoice, register Ptr    ASCBuffer, short chanNo, MADDriverRec *intDriver)
  241. {
  242.     char             *SndBuffer;
  243.     Byte            tByte;
  244.     long             i = intDriver->ASCBUFFER;
  245.     Ptr                VolPtr;
  246.  
  247.     ///
  248.     long                aDD, aCC = curVoice->lAC, off;
  249.  
  250.     aDD = (AMIGA_CLOCKFREQ2 << BYTEDIV) / ( curVoice->period * (intDriver->DriverSettings.outPutRate>>16));
  251.     ///
  252.  
  253.     if( curVoice->curPtr >= curVoice->maxPtr && curVoice->loopSize == 0) return;
  254.     
  255.     SndBuffer        = (char*)     curVoice->curPtr;
  256.     VolPtr            = (Ptr)     ( intDriver->Vol + (long) (((DoVol( curVoice) * intDriver->VolExt[ curVoice->ID])/ 64) << 8));
  257.     
  258.     if( (Ptr) SndBuffer + 1 + ((aCC + aDD * intDriver->ASCBUFFER)>>BYTEDIV) >= curVoice->maxPtr)
  259.     {
  260.         if( intDriver->DriverSettings.Interpolation)
  261.         {
  262.             long    RightWeight, LeftWeight;
  263.             
  264.             while( i-- > 0)
  265.             {
  266.                 RightWeight = aCC & ((1 << BYTEDIV) - 1);        LeftWeight = (1 << BYTEDIV) - RightWeight;
  267.                 
  268.                 off = (aCC>>BYTEDIV);
  269.                 if( (Ptr) SndBuffer + off + 1 >= curVoice->maxPtr)
  270.                 {
  271.                     if( curVoice->loopSize > 0) 
  272.                     {
  273.                         SndBuffer -= curVoice->loopSize;
  274.                         if( SndBuffer + off < curVoice->begPtr) SndBuffer = curVoice->begPtr - off;
  275.                     }
  276.                     else break;
  277.                 }
  278.                 
  279.                 tByte = ((LeftWeight **(SndBuffer + off)
  280.                         + RightWeight **(SndBuffer + off + 1)) >> BYTEDIV);
  281.                 
  282.                 *ASCBuffer    += *(VolPtr + tByte);        aCC += aDD;
  283.                 ASCBuffer    += chanNo;
  284.             }
  285.         }
  286.         else
  287.         {
  288.             while( i-- > 0)
  289.             {
  290.                 off = (aCC>>BYTEDIV);
  291.                 if( (Ptr) SndBuffer + off >= curVoice->maxPtr)
  292.                 {
  293.                     if( curVoice->loopSize > 0) 
  294.                     {
  295.                         SndBuffer -= curVoice->loopSize;
  296.                         if( SndBuffer + off < curVoice->begPtr) SndBuffer = curVoice->begPtr - off;
  297.                     }
  298.                     else break;
  299.                 }
  300.                 *ASCBuffer    += *(VolPtr + (Byte) *(SndBuffer + off));             aCC += aDD;
  301.                 ASCBuffer    += chanNo;
  302.             }
  303.         }
  304.         
  305.         if( curVoice->loopSize > 0) curVoice->curPtr = (Ptr) (SndBuffer + (long) (aCC>>BYTEDIV));
  306.         else
  307.         {
  308.             curVoice->samplePtr    = 0L;    curVoice->curPtr    = curVoice->maxPtr;
  309.         }
  310.     }
  311.     else
  312.     {
  313.         if( intDriver->DriverSettings.Interpolation)
  314.         {
  315.             long    RightWeight, LeftWeight;
  316.             
  317.             while( i-- > 0)
  318.             {
  319.                 RightWeight = aCC & ((1 << BYTEDIV) - 1);        LeftWeight = (1 << BYTEDIV) - RightWeight;
  320.                 
  321.                 off = (aCC>>BYTEDIV);
  322.                 
  323.                 tByte = ((LeftWeight **(SndBuffer + off)
  324.                         + RightWeight **(SndBuffer + off + 1)) >> BYTEDIV);
  325.                 
  326.                 *ASCBuffer    += *(VolPtr + tByte);        aCC += aDD;
  327.                 ASCBuffer    += chanNo;
  328.             }
  329.         }
  330.         else
  331.         {
  332.             while( i-- > 0)
  333.             {
  334.                 off = (aCC>>BYTEDIV);
  335.                 *ASCBuffer    += *(VolPtr + (Byte) *(SndBuffer + off));             aCC += aDD;
  336.                 ASCBuffer    += chanNo;
  337.             }
  338.         }
  339.         
  340.         curVoice->curPtr = (Ptr) (SndBuffer + (long) (aCC>>BYTEDIV));
  341.     }
  342.  
  343.     curVoice->lAC = aCC & ((1 << BYTEDIV) - 1);
  344. }
  345.  
  346. void Sampler8in16AddPoly( Channel *curVoice, register Ptr    ASCBuffer, short chanNo, MADDriverRec *intDriver)
  347. {
  348.     char                 *SndBuffer;
  349.     Byte                tByte;
  350.     Ptr                    VolPtr;
  351.     long                i = intDriver->ASCBUFFER;
  352.  
  353.     ///
  354.     long                aDD, aCC = curVoice->lAC, off;
  355.     
  356.     aDD = (AMIGA_CLOCKFREQ2 << BYTEDIV) / ( curVoice->period * (intDriver->DriverSettings.outPutRate>>16));
  357.     ///
  358.  
  359.     if( curVoice->curPtr >= curVoice->maxPtr && curVoice->loopSize == 0) return;
  360.     
  361.     SndBuffer        = (char*) curVoice->curPtr;
  362.     VolPtr            = (Ptr) (intDriver->Vol + (long) (((DoVol( curVoice) * intDriver->VolExt[ curVoice->ID])/ 64) << 8));
  363.     
  364.     if( (Ptr) SndBuffer + 2 + 2*((aCC + aDD * intDriver->ASCBUFFER)>>BYTEDIV) >= curVoice->maxPtr)
  365.     {
  366.         if( intDriver->DriverSettings.Interpolation)
  367.         {
  368.             long    RightWeight, LeftWeight;
  369.             
  370.             while( i-- > 0)
  371.             {
  372.                 RightWeight = aCC & ((1 << BYTEDIV) - 1);        LeftWeight = (1 << BYTEDIV) - RightWeight;
  373.                 
  374.                 off = (aCC>>BYTEDIV);
  375.                 if( (Ptr) SndBuffer + 2*off + 2 >= curVoice->maxPtr)
  376.                 {
  377.                     if( curVoice->loopSize > 0) 
  378.                     {
  379.                         SndBuffer -= curVoice->loopSize;
  380.                         if( SndBuffer + off < curVoice->begPtr) SndBuffer = curVoice->begPtr - off;
  381.                     }
  382.                     else break;
  383.                 }
  384.                 
  385.                 tByte = ((LeftWeight *(*(SndBuffer + 2*off))
  386.                             +    RightWeight *(*(SndBuffer + 2*off + 2)))>> BYTEDIV);
  387.                 
  388.                 *ASCBuffer += *(VolPtr + tByte);     aCC += aDD;
  389.                 ASCBuffer += chanNo;
  390.             }
  391.         }
  392.         else
  393.         {
  394.             while( i-- > 0)
  395.             {
  396.                 off = (aCC>>BYTEDIV);
  397.                 if( (Ptr) SndBuffer + 2*off + 2 >= curVoice->maxPtr)
  398.                 {
  399.                     if( curVoice->loopSize > 0) 
  400.                     {
  401.                         SndBuffer -= curVoice->loopSize;
  402.                         if( SndBuffer + off < curVoice->begPtr) SndBuffer = curVoice->begPtr - off;
  403.                     }
  404.                     else break;
  405.                 }
  406.                 
  407.                 *ASCBuffer += *(VolPtr + (Byte) (*(SndBuffer + 2*off)));             aCC += aDD;
  408.                 ASCBuffer += chanNo;
  409.             }
  410.         }
  411.         
  412.         if( curVoice->loopSize > 0) curVoice->curPtr = (Ptr) (SndBuffer + 2*(long) (aCC>>BYTEDIV));
  413.         else
  414.         {
  415.             curVoice->samplePtr    = 0L;    curVoice->curPtr    = curVoice->maxPtr;
  416.         }
  417.     }
  418.     else
  419.     {
  420.         if( intDriver->DriverSettings.Interpolation)
  421.         {
  422.             long    RightWeight, LeftWeight;
  423.             
  424.             while( i-- > 0)
  425.             {
  426.                 RightWeight = aCC & ((1 << BYTEDIV) - 1);        LeftWeight = (1 << BYTEDIV) - RightWeight;
  427.                 
  428.                 off = (aCC>>BYTEDIV);
  429.                 
  430.                 tByte = ((LeftWeight *(*(SndBuffer + 2*off))
  431.                             +    RightWeight *(*(SndBuffer + 2*off + 2)))>> BYTEDIV);
  432.                 
  433.                 *ASCBuffer += *(VolPtr + tByte);     aCC += aDD;
  434.                 ASCBuffer += chanNo;
  435.             }
  436.         }
  437.         else
  438.         {
  439.             while( i-- > 0)
  440.             {
  441.                 off = (aCC>>BYTEDIV);
  442.                 *ASCBuffer += *(VolPtr + (Byte) (*(SndBuffer + 2*off)));             aCC += aDD;
  443.                 ASCBuffer += chanNo;
  444.             }
  445.         }
  446.         
  447.         curVoice->curPtr = (Ptr) (SndBuffer + 2*(long) (aCC>>BYTEDIV));
  448.     }
  449.     
  450.     curVoice->lAC = aCC & ((1 << BYTEDIV) - 1);
  451. }
  452.  
  453.  
  454. void Sample8BufferAdd( Channel *curVoice, register Ptr ASCBuffer, MADDriverRec *intDriver)
  455. {
  456.     if( curVoice->amp == 16) Sampler8in16Add( curVoice, ASCBuffer, intDriver);
  457.     else Sampler8in8Add( curVoice, ASCBuffer, intDriver);
  458. }
  459.  
  460. void Sample8BufferAddPoly( Channel *curVoice, register Ptr ASCBuffer, short chanNo, MADDriverRec *intDriver)
  461. {
  462.     if( curVoice->amp == 16) Sampler8in16AddPoly( curVoice, ASCBuffer, chanNo, intDriver);
  463.     else Sampler8in8AddPoly( curVoice, ASCBuffer, chanNo, intDriver);
  464. }
  465.  
  466. void Play8Mono( MADDriverRec *intDriver)
  467. {
  468. long    i;
  469. Byte    *alpha = (Byte*) intDriver->IntDataPtr;
  470.  
  471.     i = intDriver->ASCBUFFER;
  472.     while( i-- > 0) *alpha++ = 0x80;
  473.     
  474.     for( i = 0 ; i < intDriver->DriverSettings.numChn; i++) Sample8BufferAddPoly ( &intDriver->chan[i], intDriver->IntDataPtr, 1, intDriver);
  475. }
  476.  
  477. void Play8Stereo( MADDriverRec *intDriver)
  478. {
  479. long    i;
  480. Byte    *alpha = (Byte*) intDriver->IntDataPtr;
  481.  
  482.     i = intDriver->ASCBUFFER*2;
  483.     while( i-- > 0) *alpha++ = 0x80;
  484.     
  485.     for( i = 0 ; i < intDriver->DriverSettings.numChn; i++)
  486.     {
  487.         Sample8BufferAdd    ( &intDriver->chan[i], intDriver->IntDataPtr, intDriver);
  488.         i++;
  489.         Sample8BufferAdd    ( &intDriver->chan[i], intDriver->IntDataPtr + 1, intDriver);
  490.     }
  491. }
  492.  
  493. void Play8PolyPhonic( MADDriverRec *intDriver)
  494. {
  495. long    i, x;
  496. Byte    *alpha = (Byte*) intDriver->IntDataPtr;
  497.  
  498.     x = intDriver->ASCBUFFER * intDriver->DriverSettings.numChn;
  499.     while( x-- > 0) *alpha++ = 0x80;
  500.     
  501.     for( i = 0 ; i < intDriver->DriverSettings.numChn; i++)
  502.     {
  503.         Sample8BufferAddPoly( &intDriver->chan[ i], intDriver->IntDataPtr + i, intDriver->DriverSettings.numChn, intDriver);
  504.     }
  505. }
  506.